import { JsonUtil } from './JsonUtil'

export const ArrayUtil = {
  /**
   * 判断数据targetArr是否包含数组arr
   * @param arr
   * @param targetArr
   * @returns {boolean}
   */
  inOf (arr, targetArr) {
    let res = true
    arr.forEach(item => {
      if (targetArr.indexOf(item) < 0) {
        res = false
      }
    })

    return res
  },
  /**
   * 判断数组targetArr是否包含元素element
   * @param element
   * @param targetArr
   * @returns {boolean}
   */
  oneOf (element, targetArr) {
    return targetArr.indexOf(element) >= 0
  },
  /**
   * 判断元素在数组中的位置
   * @param arr
   * @param element
   * @param key 不为空时，数组为对象数组
   * @returns {*}
   */
  indexOf (arr, element, key) {
    let index = -1
    if (!key) {
      return arr.indexOf(element)
    }
    for (const i in arr) {
      if (arr[i][key] === element[key]) {
        index = i
        return index
      }
    }
    return index
  },
  /**
   * 获取数组targetArr包含元素element的元素
   * @param element
   * @param targetArr
   * @returns {boolean}
   */
  getElement (element, targetArr, key) {
    if (element) {
      for (const i in targetArr) {
        const item = targetArr[i]
        if (item[key] === element) {
          if (item) {
            return JsonUtil.deepCopy(item)
          }
          return null
        }
      }
    }
    return null
  },
  /**
   * 获取数组targetArr某字段值组成的数组
   * @param targetArr
   * @returns {boolean}
   */
  getValueArray (targetArr, key) {
    if (targetArr) {
      const arr = []
      for (const i in targetArr) {
        const item = targetArr[i]
        if (item[key] !== undefined) {
          arr.push(item[key])
        }
      }
      return arr
    }
    return []
  },
  /**
   * 从数组targetArr移除元素excludeItem
   * @param targetArr
   * @param excludeItem
   * @returns {boolean}
   */
  excludeArray (targetArr, excludeItem) {
    const arr = []
    if (!excludeItem || (Array.isArray(excludeItem) && excludeItem.length === 0)) {
      return targetArr
    }
    for (let i = 0, length = targetArr.length; i < length; i++) {
      const source = targetArr[i]
      if (typeof excludeItem === 'string' && source.dictValue === excludeItem || Array.isArray(excludeItem) && this.oneOf(source.dictValue, excludeItem)) { // 被排除
        continue
      }
      arr.push(source)
    }
    return arr
  },
  /**
   * 数组对象排序-按对象某字段排序
   * @param field
   * @returns {function(*, *): number}
   */
  _sortBy (field) {
    return (a, b) => {
      if (a[field] && b[field]) {
        return a[field] - b[field]
      }
      return 0
    }
  },
  sort (arr = [], field) {
    arr.sort(this._sortBy(field))
    return arr
  },
  /**
   * 数组中的所有元素通过指定的分隔符进行分隔,放入一个字符串
   * @param arr 数组
   * @param separator 分隔符
   * @param prefix 字符串前缀
   * @param suffix 字符串后缀
   * @returns {string}
   */
  join (arr = [], separator, prefix, suffix) {
    if (arr && Array.isArray(arr)) {
      separator = separator || ','
      prefix = prefix || ''
      suffix = suffix || ''
      return prefix + arr.join(separator) + suffix
    }
  },
  /**
   * 获取数组targetArr包含元素element的元素
   * @param element
   * @param targetArr
   * @param options: 需要额外添加的 字段
   * @returns {boolean}
   */
  getTreeOptions (targetArr, id, label, options = []) {
    const jsonArray = []
    id = id || 'dictValue'
    label = label || 'dictLabel'
    for (const i in targetArr) {
      const item = targetArr[i]
      const obj = {}
      obj.id = item[id]
      obj.label = item[label]

      options.forEach(j => {
        obj[j] = item[j]
      })

      obj.children = []
      jsonArray.push(obj)
    }
    return jsonArray
  }
}
